local config = {
["lines"] = 5,
["startY"] = 0.35,
["textHeight"] = 16,
["iconHeight"] = 20,
["iconSpacing"] = 4,
["defaultWeapon"] = 255,
["fadeTime"] = 5000,
["startFade"] = 15000,
["align"] = "right",
["startX"] = -10
}
local default = {
["lines"] = 5,
["startY"] = 0.25,
["textHeight"] = 16,
["iconHeight"] = 20,
["iconSpacing"] = 4,
["defaultWeapon"] = 255,
["fadeTime"] = 5000,
["startFade"] = 15000,
["align"] = "right",
["startX"] = -10
}

function KillMessages_onPlayerWasted(totalammo, killer, killerweapon, bodypart)
	local usedVehicle = nil
	local killerType = nil
	local killerweapon = killerweapon or 255
	-- In very rare cases killer isn't nil or false but isn't an element.
	if (killer and not isElement(killer)) then
		killer = nil
	end
	if (killer) then
		killerType = getElementType(killer)
	end
	-- Sometimes the killer is returned as the driver instead of vehicle, like when driving a Rhino but we need the vehicle ID
	if (killerType == "player") then
		local vehicle = getPedOccupiedVehicle(killer)
		if (vehicle and getPedWeapon(killer) == 0) then
			usedVehicle = getElementModel(vehicle)
		end
	end
	-- Change the killer into the vehicle controller
	if (killer and killerType == "vehicle") then
		usedVehicle = getElementModel(killer)
		killer = getVehicleController(killer) or killer
		killerType = getElementType(killer)
	end
	-- If killed by rocket and was on foot player turn it into their current weapon
	if (killerweapon == 19 and killerType == "player" and not isPedInVehicle(killer)) then
		killerweapon = getPedWeapon(killer) or 51
	end
	-- Got a killer? Print the normal "* X died" if not
	if (killer and killerType == "player") then
		local kr, kg, kb = getPlayerNametagColor(killer)
		if (getPlayerTeam(killer)) then
			kr, kg, kb = getTeamColor(getPlayerTeam(killer))
		end
		-- Suicide?
		if (source == killer) then
			local triggered = triggerEvent("onPlayerKillMessage", source, false, killerweapon, bodypart)
			--outputDebugString("Cancelled: "..tostring(triggered))
			if (triggered) then
				eventTriggered(source, false, killerweapon, bodypart, true, usedVehicle)
				return
			end
		end
		local triggered = triggerEvent("onPlayerKillMessage", source, killer, killerweapon, bodypart)
		--outputDebugString("Cancelled: "..tostring(triggered))
		if (triggered) then
			eventTriggered(source, killer, killerweapon, bodypart, false, usedVehicle)
		end
	else
		local triggered = triggerEvent("onPlayerKillMessage", source, false, killerweapon, bodypart)
		--outputDebugString("Cancelled: "..tostring(triggered))
		if (triggered) then
			eventTriggered(source, false, killerweapon, bodypart, false, usedVehicle)
		end
	end
end
addEventHandler("onPlayerWasted", root, KillMessages_onPlayerWasted)

addEvent ( "onPlayerKillMessage" )
function eventTriggered ( source,killer,weapon,bodypart,suicide,usedVehicle )
	local wr,wg,wb = getPlayerNametagColor	( source )
	if getPlayerTeam ( source ) then
		wr,wg,wb = getTeamColor ( getPlayerTeam ( source ) )
	end
	local kr,kg,kb = false,false,false
	if ( killer ) then
		kr,kg,kb = getPlayerNametagColor	( killer )
		if getPlayerTeam ( killer ) then
			kr,kg,kb = getTeamColor ( getPlayerTeam ( killer ) )
		end
	end
	if ( usedVehicle ) then
		weapon = usedVehicle
	end
	outputKillMessage ( source, wr,wg,wb,killer,kr,kg,kb,weapon )
	--
	local extra = ""
	if ( usedVehicle ) then
	extra = " (Vehicle)"
	end
	if ( killer ) then
		if suicide then
			local weaponName = getWeaponNameFromID ( weapon )
			if weaponName then
				outputConsoleKillMessage ( "* "..getPlayerName(source).." killed himself. ("..weaponName..")" )
			else
				outputConsoleKillMessage ( "* "..getPlayerName(source).." killed himself."..extra )
			end
		else
			local weaponName = getWeaponNameFromID ( weapon )
			if weaponName then
				outputConsoleKillMessage ( "* "..getPlayerName(killer).." killed "..getPlayerName(source)..". ("..weaponName..")" )
			else
				outputConsoleKillMessage ( "* "..getPlayerName(killer).." killed "..getPlayerName(source).."."..extra )
			end
		end
	else
		outputConsoleKillMessage ( "* "..getPlayerName(source).." died."..extra )
	end
	--
end

function outputConsoleKillMessage ( text )
	outputConsole ( text )
end

function outputKillMessage ( killed, wr,wg,wb,killer,kr,kg,kb,weapon,width,resource )
	if ( resource ) then resource = getResourceName(resource) end
	if not isElement(killed) then
		outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100)
		return false
	end
	if not getElementType(killed) == "player" then
		outputDebugString ( "outputKillMessage - Invalid 'wasted' player specified",0,0,0,100)
		return false
	end
	return triggerClientEvent(getRootElement(),"onClientPlayerKillMessage",killed,killer,weapon,wr,wg,wb,kr,kg,kb,width,resource )
end

function outputMessage ( message, visibleTo, r, g, b, font )
	if type(message) ~= "string" and type(message) ~= "table" then
		outputDebugString ( "outputMessage - Bad 'message' argument", 0, 112, 112, 112 )
		return false
	end
	if not isElement(visibleTo) then
		outputDebugString ( "outputMessage - Bad argument", 0, 112, 112, 112 )
		return false
	end
	--Turn any resources into resource names
	if type(message) == "table" then
		for i,part in ipairs(message) do
			if type(part) == "table" and part[1] == "image" then
				if part.resource then
					message[i].resourceName = getResourceName(part.resource)
				else
					part.resourceName = getResourceName(sourceResource)
				end
			end
		end
	end
	return triggerClientEvent ( visibleTo, "doOutputMessage", visibleTo, message, r, g, b, font )
end

function setKillMessageStyle ( startX,startY,align,lines,fadeStart,fadeAnimTime )
	if ( not startX ) then startX = default.startX end
	if ( not startY ) then startY = default.startY end
	if ( not align ) then startY = align.startY end
	if ( not lines ) then lines = default.lines end
	if ( not fadeStart ) then fadeStart = default.startFade end
	if ( not fadeAnimTime ) then fadeAnimTime = default.fadeTime end
	config.startX = startX
	config.startY = startY
	config.align = align
	config.lines = lines
	config.startFade = fadeStart
	config.fadeTime = fadeAnimTime
	for k,v in ipairs(getElementsByType"player") do
		triggerClientEvent(v,"doSetKillMessageStyle",v,config.startX,config.startY,config.alignX,config.lines,config.startFade,config.fadeTime)
	end
	return true
end

addEvent ("onClientKillmessagesLoaded",true)
addEventHandler ( "onClientKillmessagesLoaded", getRootElement(),
function()
	triggerClientEvent(client,"doSetKillMessageStyle",client,config.startX,config.startY,config.alignX,config.lines,config.startFade,config.fadeTime)
end )
